/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package persistencia.controller

import persistencia.conexao.IConexao;
import persistencia.conexao.Conexao;
import groovy.sql.Sql;
import persistencia.controller.IPedidoController;
import bean.PedidoCompra;
import bean.PedidoCompraItem;
import bean.BuscaChaveEstrangeira;
import org.postgresql.util.PSQLException;
import java.util.Vector;

/**
 *
 * @author André
 */
class PedidoController implements IPedidoController{

    def boolean createPedido(Vector<PedidoCompra> pedidos){

        Sql bd = null;
        try{
            bd = Conexao.getInstance().getConexao();
            static long UM_DIA = 86400000;
            def sql = "BEGIN;"
            def lista = [];

            println "No PedidoController"
            for(PedidoCompra i : pedidos){
                System.out.println("Fornecedor: " + i.getTcod_fornecedor_fk());
                System.out.println("Valor total: " + i.getTdata_previsao_faturamento());
                for(PedidoCompraItem j : i.getPedidoCompraItemList()){
                    System.out.println("Mercadoria: " + j.getTcod_merc_fpk());
                    System.out.println("Valor Mercadoria: " + j.getTvalor_total());
                }
            }

            def sqlPedidoJaExiste = "SELECT count(*) from compras.tpedido_compra where tcotacao_fk = " + pedidos.get(0).getTcotacao_fk()

            Integer count = 0;
            bd.eachRow(sqlPedidoJaExiste){
                count = new Integer(it.toRowResult().getAt("count").intValue());
            }

            if(count > 0){
                return true;    //já foram gerados os pedidos
            }

            for(PedidoCompra pedido : pedidos){
                def fornecedor = pedido.getTcod_fornecedor_fk();
                def unidade = pedido.getTunidade_fk();
                //java.util.Date dataUtil = new java.util.Date();
                java.sql.Date dataSql = new java.sql.Date(new Date().getTime());
                def data = dataSql;
                java.sql.Date dataFaturamentoSql = new java.sql.Date(dataSql.getTime() + 5*UM_DIA);
                def dataFaturamento = dataFaturamentoSql;
                
                def condicaoCompra = pedido.getTcondicao_compra_fk();                
                def frete = pedido.getTacordo_frete();
                def valorPedido = pedido.getTvalor_pedido();
                def saldoEntregar = pedido.getTsaldo_a_entregar();
                def qtde = pedido.getTqtde_itens_merc();
                def obs = pedido.getTobs();
                def status = pedido.getTstatus_pedido_chk();
                def usuario = pedido.getTusuario_comprador_fk();
                def valorBruto = pedido.getTvalor_bruto();
                def descontoPerc = pedido.getTdesconto_perc();
                def descontoValor = pedido.getTdesconto_valor();
                def valorLiquido = pedido.getTvalor_liquido_pedido();
                def cotacao = pedido.getTcotacao_fk();

                //como não consegui  tratar no BPEL o NULL eu trato aqui mesmo de "outra forma"
                if(cotacao == -1){
                    cotacao = null;
                }

                def sqlPedidoCompra = "insert into " +
            "compras.tpedido_compra(tcod_fornecedor_fk, tunidade_fk, tdata, tcondicao_compra_fk, " +
            "tdata_previsao_faturamento, tacordo_frete, tvalor_pedido, tsaldo_a_entregar, " +
            "tqtde_itens_merc, tobs, tstatus_pedido_chk, tusuario_comprador_fk, tvalor_bruto, " +
            "tdesconto_perc, tdesconto_valor, tvalor_liquido_pedido, tcotacao_fk) " +
            "values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);"

                sql = sql.concat(sqlPedidoCompra);

                def sqlPedidoItens = "insert into " +
            "compras.tpedido_compra_item(tcod_merc_fpk, tqtde_compra, " +
            "tpreco_compra, tqtde_chegada, tpreco_compra_liquido, tcodigo_original, " +
            "tdesconto_ped_perc, tdesconto_ped_valor, tvalor_liquido, tvalor_total) " +
            "values(?,?,?,?,?,?,?,?,?,?);";

                //ANTES DE INICIAR AS TRANSAÇÕES FAZER O BEGIN E NO FINAL FAZER O COMMIT

                def listaPedido = [fornecedor, unidade, data, condicaoCompra, dataFaturamento, frete, valorPedido,
                    saldoEntregar, qtde, obs, status, usuario, valorBruto, descontoPerc,
                    descontoValor, valorLiquido, cotacao];

                lista = lista + listaPedido

                //bd.execute(sqlPedidoCompra, listapedido);

                for(PedidoCompraItem i : pedido.getPedidoCompraItemList()){

                    sql = sql.concat(sqlPedidoItens);

                    def mercadoria = i.getTcod_merc_fpk();
                    def qtdeCompra = i.getTqtde_compra();
                    def precoCompra = i.getTpreco_compra();
                    def qtdeChegada = i.getTqtde_chegada();
                    def precoCompraLiquido = i.getTpreco_compra_liquido();
                    def codigoOriginal = i.getTcodigo_original();
                    def descontoPercItem = i.getTdesconto_ped_perc();
                    def descontoValorItem = i.getTdesconto_ped_valor();
                    def valorLiquidoItem = i.getTvalor_liquido();
                    def valorTotalItem = i.getTvalor_total();

                    def listaItens = [mercadoria, qtdeCompra, precoCompra, qtdeChegada,
                        precoCompraLiquido, codigoOriginal, descontoPercItem, descontoValorItem,
                        valorLiquidoItem, valorTotalItem];
                    //bd.execute(sqlpedidoMercadorias, listaMercadorias);

                    lista = lista + listaItens;
                }
            }
            sql = sql.concat("COMMIT;")
            println "SQL: " + sql;
            println "Lista: " + lista;
            bd.execute(sql, lista);
            return true;
        }
        catch(PSQLException e){
            System.err.println("PSQLException - pedidoController.create(): " + e.getMessage());
            e.printStackTrace();
            if(bd != null){
                bd.rollback();
            }
            return false;
        }
        catch(Exception e){
            System.err.println("Exception - pedidoController.create(): " + e);
            e.printStackTrace();
            if(bd != null){
                bd.rollback();
            }
            return false;
        }
    }

    def Vector<PedidoCompra> readPedido(String data, String nomeFornecedor){

        try{
            Sql bd = Conexao.getInstance().getConexao();

            def sqlFornecedor = "SELECT tcod_fornecedor_pk FROM compras.tfornecedor where tnome_fantasia ~* '" + nomeFornecedor + "'"

            Vector<PedidoCompra> listMae = new Vector<PedidoCompra>();
            Vector<PedidoCompraItem> listFilha = new Vector<PedidoCompraItem>();
            Vector<Integer> fornecedores = new Vector<Integer>();

            bd.eachRow(sqlFornecedor){
                fornecedores.add(new Integer(it.toRowResult().getAt("tcod_fornecedor_pk")));
            }

            for(int i = 0; i < fornecedores.size(); i++){
                def sqlMae = "SELECT * FROM compras.tpedido_compra WHERE tdata = '" + data + "' AND " +
                         "tcod_fornecedor_fk = " + fornecedores.get(i)
                bd.eachRow(sqlMae){
                    PedidoCompra p = new PedidoCompra(it.toRowResult())
                    
                    if(p.getTcotacao_fk() == null)  //como não acertei tratar NULL no BPEL...
                    p.setTcotacao_fk(-1);
                    listMae.add(p);
                }
            }            
        
            for(PedidoCompra i : listMae){
                def sqlFilha = "SELECT * FROM compras.tpedido_compra_item WHERE " +
                              "tcod_pedido_fpk = " + i.getTcodigo_pk();
                bd.eachRow(sqlFilha){
                    //result << it.toRowResult()
                    listFilha.add(new PedidoCompraItem(it.toRowResult()));
                }
                i.setPedidoCompraItemList(new Vector(listFilha));
                listFilha.clear();
            }

            if(listMae.isEmpty()){
                PedidoCompraItem i = new PedidoCompraItem();
                Vector<PedidoCompraItem> l = new Vector<PedidoCompraItem>();
                l.add(i);
                PedidoCompra p = new PedidoCompra();
                p.setPedidoCompraItemList(l);
                listMae.add(p);
            }
        
            return listMae;
        }
        catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }

    def PedidoCompra readPedidoPorId(Integer codigoPedido){

        try{
            Sql bd = Conexao.getInstance().getConexao();

            def sqlMae = "SELECT * FROM compras.tpedido_compra WHERE tcodigo_pk = " + codigoPedido;
            def sqlFilha = "SELECT * FROM compras.tpedido_compra_item WHERE " +
                      "tcod_pedido_fpk = " + codigoPedido;
        
            Vector<PedidoCompraItem> list = new Vector<PedidoCompraItem>();

            PedidoCompra ped = new PedidoCompra();

            bd.eachRow(sqlFilha){
                //result << it.toRowResult()
                list.add(new PedidoCompraItem(it.toRowResult()));
            }

            bd.eachRow(sqlMae){
                ped = new PedidoCompra(it.toRowResult());
                if(ped.getTcotacao_fk() == null)  //como não acertei tratar NULL no BPEL...
                ped.setTcotacao_fk(-1);
            }

            if(list.isEmpty())
            list.add(new PedidoCompraItem())
            
            ped.setPedidoCompraItemList(list);

            return ped;
        }
        catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }


    def boolean deletePedido(Integer codigoPedido){

        Sql bd = null;
        try{
            bd = Conexao.getInstance().getConexao();

            def sql = "BEGIN;"

            def sqlFilha = "DELETE FROM compras.tpedido_compra_item WHERE tcod_pedido_fpk = ?;";
            sql = sql.concat(sqlFilha);
            def sqlMae = "DELETE FROM compras.tpedido_compra WHERE tcodigo_pk = ?;";
            sql = sql.concat(sqlMae);

            sql = sql.concat("COMMIT;")
            
            def lista = [codigoPedido, codigoPedido];

            bd.execute(sql, lista);
            return true;
                
        }
        catch(Exception e){
            e.printStackTrace();
            if(bd != null){
                bd.rollback();
            }
            return false;
        }
    }
}